package main

import (
	"fmt"
	"github.com/axgle/mahonia"
	"github.com/gocolly/colly"
	"github.com/gocolly/colly/debug"
	"net"
	"net/http"
	"time"
)

//申明常量
const (
	urlName = "http://top.baidu.com/buzz?b=353&fr=topbuzz"
	reqUrl  = "top.baidu.com"
)

func main() {
	//colly.NewCollector()创建一个类型为*colly.Collector的爬虫对象,并且只爬取域名为www.baidu.com
	//c := colly.NewCollector(colly.AllowedDomains(reqUrl))
	c := colly.NewCollector(colly.UserAgent("Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.163 Safari/537.36"),
		colly.MaxDepth(1), colly.Debugger(&debug.LogDebugger{}), colly.AllowedDomains(reqUrl))
	//定义一个hot 指针数组
	//& 是取地址符号 , 即取得某个变量的地址 , 如 ; &a
	//*是指针运算符 , 可以表示一个变量是指针类型 , 也可以表示一个指针变量所指向的存储单元 , 也就是这个地址所存储的值 .
	//var hots [] * trust.Hot

	c.WithTransport(&http.Transport{
		Proxy: http.ProxyFromEnvironment,
		DialContext: (&net.Dialer{
			Timeout:   30 * time.Second, // 超时时间
			KeepAlive: 30 * time.Second, // keepAlive 超时时间
			DualStack: true,
		}).DialContext,
		MaxIdleConns:          100,              // 最大空闲连接数
		IdleConnTimeout:       90 * time.Second, // 空闲连接超时
		TLSHandshakeTimeout:   10 * time.Second, // TLS 握手超时
		ExpectContinueTimeout: 1 * time.Second,
	})

	//注册HTML回调，对每个有href属性的a元素执行回调函数。也就是说解析爬取到的网页，然后继续访问网页中指向其他页面的链接。
	c.OnHTML("td[class='keyword']", func(e *colly.HTMLElement) {
		//文章链接
		href := e.ChildAttr("a[class='list-title']", "href")
		//文章标题
		title := e.ChildText("a[class='list-title']")
		//转换乱码
		str := coverGBKToUTF8(title)
		fmt.Println(str, href)

		/*list-title
		link := e.Attr("href")
		fmt.Printf("Link found: %q -> %s\n", e.Text, link)
		c.Visit(e.Request.AbsoluteURL(link))*/

		//hot := &trust.Hot{}
		//
		//err := e.Unmarshal(hot)
		//if err != nil {
		//	fmt.Println("error:", err)
		//	return
		//}
		//hots = append(hots,hot)
	})

	c.OnRequest(func(r *colly.Request) {
		fmt.Println("Visiting", r.URL.String())
	})

	c.OnResponse(func(r *colly.Response) {
		fmt.Printf("Response %s: %d bytes\n", r.Request.URL, len(r.Body))
	})

	c.OnError(func(r *colly.Response, err error) {
		fmt.Printf("Error %s: %v\n", r.Request.URL, err)
	})

	c.Visit(urlName)

}

func coverGBKToUTF8(src string) string {
	return mahonia.NewDecoder("gbk").ConvertString(src)
}
